using System;
using System.Collections.Generic;
namespace CommandLib.Base
{
	public class CheckHelper
	{
		public static short CRC(byte[] data, int offset, int length)
		{
			short num = -1;
			short num2 = -24575;
			for (int num3 = offset; num3 <= offset + (length - 1); num3++)
			{
				num ^= (short)data[num3];
				for (int num4 = 0; num4 <= 7; num4++)
				{
					byte b = Convert.ToByte((int)(num & 1));
					num = (short)(num >> 1);
					if (b == 1)
					{
						num ^= num2;
					}
				}
			}
			return num;
		}
		public static byte Check(byte[] data, int offset, int length)
		{
			short num = 0;
			for (int num2 = offset; num2 <= offset + (length - 1); num2++)
			{
				num += (short)data[num2];
				if (num > 255)
				{
					num -= 255;
				}
			}
			return (byte)num;
		}
        //public static byte CheckXOR(byte[] data, int offset, int length)
        //{
        //    byte b = 0;
        //    for (int i = 0; i < length; i++)
        //    {
        //        b = ((data[i + offset] ^ b) & 255);
        //    }
        //    return b;
        //}
        //public static void XORAndEscape(ref List<byte> data, int offset, int length)
        //{
        //    byte b = 0;
        //    for (int i = offset; i < offset + length; i++)
        //    {
        //        b = (data[i] ^ b);
        //        if (data[i] == 126)
        //        {
        //            data[i] = 125;
        //            data.Insert(i + 1, 2);
        //            length++;
        //            i++;
        //        }
        //        else
        //        {
        //            if (data[i] == 125)
        //            {
        //                data.Insert(i + 1, 1);
        //                length++;
        //                i++;
        //            }
        //        }
        //    }
        //    data.Insert(offset + length, b);
        //    if (b == 126)
        //    {
        //        data.Insert(offset + length + 1, 2);
        //    }
        //    else
        //    {
        //        if (b == 125)
        //        {
        //            data.Insert(offset + length + 1, 1);
        //        }
        //    }
        //}
		public static short CRC2(byte[] data, int offset, int length)
		{
			int num = length;
			byte[] array = new byte[length + 2];
			Array.Copy(data, offset, array, 0, length);
			int num2 = 0;
			int i = 0;
			byte b = array[num2++];
			byte b2 = array[num2++];
			array[num] = 0;
			array[num + 1] = 0;
			while (--num >= 0)
			{
				byte b3 = array[num2++];
				for (i = 0; i < 8; i++)
				{
					if ((b & 128) >> 7 == 1)
					{
						b = (byte)(b << 1);
						if ((b2 & 128) >> 7 == 1)
						{
							b |= 1;
						}
						b2 = (byte)(b2 << 1);
						if ((b3 & 128) >> 7 == 1)
						{
							b2 |= 1;
						}
						b3 = (byte)(b3 << 1);
						b ^= 16;
						b2 ^= 33;
					}
					else
					{
						b = (byte)(b << 1);
						if ((b2 & 128) >> 7 == 1)
						{
							b |= 1;
						}
						b2 = (byte)(b2 << 1);
						if ((b3 & 128) >> 7 == 1)
						{
							b2 |= 1;
						}
						b3 = (byte)(b3 << 1);
					}
				}
			}
			return (short)(((int)b << 8) + (int)b2 & 65535);
		}
		public static void CRC2AndEscape(List<byte> data, int offset, int length)
		{
			short value = CheckHelper.CRC2(data.ToArray(), offset, length);
			byte[] bytes = BitConverter.GetBytes(value);
			data.Insert(offset + length, bytes[1]);
			data.Insert(offset + length + 1, bytes[0]);
			length += 2;
			for (int i = offset; i < offset + length; i++)
			{
				if (data[i] == 91)
				{
					data[i] = 90;
					data.Insert(i + 1, 1);
					i++;
					length++;
				}
				else
				{
					if (data[i] == 90)
					{
						data[i] = 90;
						data.Insert(i + 1, 2);
						i++;
						length++;
					}
					else
					{
						if (data[i] == 93)
						{
							data[i] = 94;
							data.Insert(i + 1, 1);
							i++;
							length++;
						}
						else
						{
							if (data[i] == 94)
							{
								data[i] = 94;
								data.Insert(i + 1, 2);
								i++;
								length++;
							}
						}
					}
				}
			}
		}
	}
}
